home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / apl / apltex_.com / RSBQ.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-28  |  2.4 KB  |  82 lines

  1. #include "apl2c_h.h"
  2.  
  3. void main(void);
  4.  
  5. void main (void)
  6. {
  7.      unsigned int aplcs,left,right;
  8.      int elems,pars,bytes;
  9.      int rsbarg[4];
  10.      struct aplvhdr rarg,result;
  11.  
  12.      aplcs = apl_cs();
  13.      right = peek(aplcs,0x80);
  14.      left = peek(aplcs,0x82);
  15.  
  16.      rsbarg[2] = 0,rsbarg[3] = 0;     /* define default values    */
  17.                                       /* (will force empty result */
  18.                                       /* .if error occurs)        */
  19.  
  20.      rarg.ptr = right;      /* load segment value into $PTR field */
  21.      apl_vhdr(&rarg);                 /* load up header info */
  22.  
  23.      if( (rarg.type == 1) && (rarg.rank == 1) && (rarg.dimens[0] == 4) )
  24.           apl_vfdata(&rarg,(char far *)rsbarg);  /* if okay,load data */
  25.  
  26.      svp_relm(rarg.ptr);              /* release right arg stuff */
  27.  
  28.      result.type = 3;                 /* res type = char */
  29.      result.rank = 2;                 /* two dim array */
  30.      result.dimens[0] = rsbarg[2];    /* 1st dim=#rows */
  31.      result.dimens[1] = rsbarg[3];    /* 2nd dim=#cols */
  32.  
  33.      elems = rsbarg[2] * rsbarg[3];
  34.      bytes = elems;
  35.      pars = 1 + bytes / 16;
  36.      result.ptr = svp_getm(pars);
  37.      bytes = pars * 16;
  38.      result.nb = bytes;
  39.      result.nelm = elems;
  40.  
  41.      vhdr_apl(&result);               /* put hdr data where APL will find */
  42.      rsb( MK_FP(result.ptr,12),
  43.           rsbarg[0],rsbarg[1],rsbarg[2],rsbarg[3]);
  44.  
  45.      poke(aplcs,0x80,result.ptr);     /* result ptr to APL */
  46.      poke(aplcs,0x82,0);              /* 0 out unused arg ptr */
  47.  
  48. }
  49.  
  50.  
  51. /*
  52.     RSB.C - read screen block
  53. */
  54.  
  55. void rsb(char far *,int,int,int,int);
  56.  
  57. void rsb(bufr,srow,scol,nrows,ncols)
  58. char far * bufr;
  59. int srow,scol,nrows,ncols;
  60. {
  61.      long vidoffset,rowstart,posn;
  62.      int i,j;
  63.      char mon_type;
  64.  
  65.      mon_type = *(char far *) 0x00400049;
  66.      if(mon_type == 7)       /* mono */
  67.           vidoffset = 0xb0000000;
  68.      else
  69.           vidoffset = 0xb8000000;
  70.  
  71.      rowstart = vidoffset + srow * 160;  /* row start for first */
  72.      rowstart += 2 * scol;               /* row of block        */
  73.      for(i = 0;i < nrows;i ++)
  74.        {  posn = rowstart;
  75.           for(j = 0;j < ncols;j ++)
  76.             {  *bufr++ = *(char far *)posn;
  77.                posn += 2;                /* next char */
  78.             }
  79.           rowstart += 160;               /* next row */
  80.        }
  81. }
  82.